/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package info.server;

import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author mark
 */
public class SocketConnection {
    //Declareer benodigde variabelen.
    private ServerSocket server;
    private InfoServer main;
    private boolean loop = true;
    public boolean checkquery = true;
    
    public SocketConnection(InfoServer main)
    {        
        //Maak de main van deze klasse de InfoServer die is meegegeven.
        this.main = main;
        //Probeer een nieuwe socket aan te maken.
        try 
        {
            server = new ServerSocket(4444);
            //Voeg toe aan de log dat er een connectie is gemaakt.
            main.getMainScreen().addToLog("New connection made");
        } 
        //Als er geen socket kan worden aangemaakt
        catch (IOException ex) 
        {
            //Voeg toe aan de log dat er geen conenctie kan worden gemaakt.
            main.getMainScreen().addToLog("Can't make new connection.");
        }  
    }
    //Klasse om aanvragen van clients te acdepteren
    public void handleConnection(){
        //Schrijf naar de log dat er wordt gewacht op verbinding met een client.
        main.getMainScreen().addToLog("Waiting for client connection");
        //Loopje om alle connecties die worden gestart door de client te accepteren.
        while (loop == true){
            try {
                Socket socket = server.accept();
                // Multi-threading
                ConnectionHandler connectionHandler = new ConnectionHandler( main, socket);
            }
            catch(BindException ex){
            }
            catch (IOException ex) {
            }
        }
    }
    //Stop de connectie
    public void stopConnection(){
        loop = false;
        main.getMainScreen().addToLog("Connection service stopped");
    }
    //Start de connectie
    public void startConnection(){
        loop = true;
        main.getMainScreen().addToLog("Connection service started");
    }
    
public class ConnectionHandler extends com.fdsapi.ResultSetUtils implements Runnable {
    //Attributen
    private Socket socket;
    private InfoServer main;
    private ResultSet result;
    private ResultSet columnresult;
    private File temp = new File("C:\\temp.log");
    private File number = new File ("C:\\number.log");
    private Thread t = new Thread(this);

    //Constructor
    public ConnectionHandler( InfoServer main, Socket socket){
        this.main = main;
        this.socket = socket;

        // Start nieuwe thread
        t.start();
        
        
    }
    
    //Methodes
    @Override
    public void run(){
        try {
            
            //lees een Query van client
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            String query = (String) ois.readObject();
            main.getMainScreen().addToLog("Query Received:" + query );
            
            //Voer de query uit op database en maak een arraylist d.m.v. methode Results2Array
            result = main.getSqlConnection().executeSelectQuery(query);
            if (result == null)
            {
                Object[][] resultsarray = new Object[1][1];
                resultsarray[0][0] = "invalid";
                
                if ( resultsarray != null ){
                    //Stuur het resultaat terug
                    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject(resultsarray);
                    main.getMainScreen().addToLog("Result send:" + result );
                    oos.close();
                }


                ois.close();
                //oos.close();
                socket.close();

                main.getMainScreen().addToLog("Ingevoerde query is onjuist");
                
            }
            else
            {
            
                Object[][] resultsarray = resultSetToObjectArray(result);


                if ( resultsarray != null ){
                    //Stuur het resultaat terug
                    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                    oos.writeObject(resultsarray);
                    main.getMainScreen().addToLog("Result send:" + result );
                    oos.close();
                }


                ois.close();
                //oos.close();
                socket.close();
                main.getMainScreen().addToLog("Waiting for new query from client");
            }
        } catch (IOException ex){
        } catch (ClassNotFoundException ex){
        } catch(SQLException ex){
        }
        
        
    }
    
   }
}
